//============================================================================================
/**
 * @file	score_board.c
 * @brief	得点表
 * @author	Nozomu Saito
 */
//============================================================================================

//このアプリはアクターデータの支点を左上としています
#include "common.h"

#include "score_board.h"
#include "system/fontproc.h"
#include "system/fontoam.h"
#include "system/arc_util.h"
#include "system/clact_tool.h"

#include "pkthln_act_def.h"

#define BOARD_FONT_OAM_MAX	(ENTRY_MEMBER_NUM_MAX)

#define NUMBER_NUM	(3)		//点数三桁

#define BOARD_PALETTE_NUM	(5)
#define BOARD_PLT_OFS		(0)

//フォントOAM関連
#define PANEL_MSG_MARGIN	(0)
#define FONTOAM_PAL_NO	(4)
#define FONT_CHR_LEN_TRNAME	(8)
#define FONT_CHR_HEIGHT		(2)		//フォント高さ(キャラ)

#define MSGCOLOR_NAME		(GF_PRINTCOLOR_MAKE(1, 2, 0))	//FONT_SYSTEMなので背景抜き色指定

//フレームアクターを親としたときのフォントOAMの表示オフセット
#define FOAM_Y	(-8*2)
//BMPウィンドウ内 名前表示オフセットX
#define NAME_OFS	(2)

#define BOARD_Y	(16)
#define BOARD_W	(64)
#define NUMBER_X	(8)
#define NUMBER_Y	(  BOARD_Y + 8 )
#define NUMBER_W	(16)
#define NUMBER_XOFS	(64)

///アニメオフセット
#define NUMBER_ANM_OFS	(1)

//プライオリティ
#define BOARD_PRI_FONT	(0)		//フォント
#define PRI_NUMBER		(1)		//数字
#define PRI_BOARD		(2)		//ボード

typedef struct BOARD_FONT_OAM_tag
{
	FONTOAM_OBJ_PTR ObjPtr;
	CHAR_MANAGER_ALLOCDATA Data;
}BOARD_FONT_OAM;

typedef struct FOAM_SETUP_DATA_tag
{
	//BMP
	GF_BGL_BMPWIN BmpWin;
	//フォント
	FONTOAM_OAM_DATA_PTR OamDataPtr;
	//データサイズ
	int Size;
}FOAM_SETUP_DATA;

typedef struct BOARD_ACT_tag
{
	PKTHLN_ACT_PTR Board;	//ボード
	PKTHLN_ACT_PTR Number[NUMBER_NUM];	//数字三桁
	BOARD_FONT_OAM Name;	//トレーナー名
}BOARD_ACT;

typedef struct BOARD_tag
{
	//アクター群
	BOARD_ACT BoardAct;
	//点数
	int Score;
	//表示擬似点数
///	int RndScore;
	//表示Y座標
	int Y;
}BOARD;

typedef struct SCORE_BOARD_tag
{
	int HeapID;					//ヒープID
	PKTHLN_CLACT_CNT_PTR ActCntPtr;	//アクターコントローラ
	FONTOAM_SYS_PTR		FontOamSys;	///<FontOamマネージャ

	FOAM_SETUP_DATA		FntOamSetupData;
	BOARD		Board[ENTRY_MEMBER_NUM_MAX];
}SCORE_BOARD;

static void MakeFontOam(SC_BOARD_PTR ptr, FOAM_SETUP_DATA *inData,
		const STRBUF *str, const int inXOfs, const int inX, const int inY,
		CLACT_WORK_PTR parent, BOARD_FONT_OAM *outFontOam);
static void DeleteFontOam(BOARD_FONT_OAM *outFontOam);
static void RefScoreAct(BOARD_ACT *act, const int inScore);

//--------------------------------------------------------------------------------------------
/**
 * @brief	初期化
 * @param	inHeapID			ヒープID
 * @param	bgl					bgl
 * @param	cnt_ptr				ポケスロンアクターコントロールポインタ
 *
 * @return	SC_BOARD_PTR		コントロールポインタ
 */
//--------------------------------------------------------------------------------------------
SC_BOARD_PTR ScoreBoard_Init(const int inHeapID, GF_BGL_INI *bgl,
		PKTHLN_CLACT_CNT_PTR cnt_ptr)
{
	SC_BOARD_PTR ptr;
	FOAM_SETUP_DATA *data;

	ptr = sys_AllocMemory(inHeapID, sizeof(SCORE_BOARD));
	//メモリクリア
	MI_CpuClear8( ptr, sizeof(SCORE_BOARD));
	ptr->HeapID = inHeapID;
	//フォントOAMマネージャ作成
	ptr->FontOamSys = FONTOAM_SysInit(BOARD_FONT_OAM_MAX, inHeapID);
	//ポインタセット
	ptr->ActCntPtr = cnt_ptr;

	data = &ptr->FntOamSetupData;

	//BMP作成
	GF_BGL_BmpWinInit(&data->BmpWin);
	GF_BGL_BmpWinObjAdd(bgl, &data->BmpWin,
			FONT_CHR_LEN_TRNAME, FONT_CHR_HEIGHT, 0, 0);
	//OAMDATAを作成
	data->OamDataPtr = FONTOAM_OAMDATA_Make(&data->BmpWin, ptr->HeapID);
	data->Size = FONTOAM_OAMDATA_NeedCharSize(data->OamDataPtr, NNS_G2D_VRAM_TYPE_2DSUB);

	return ptr;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	解放
 * @param	ptr					コントロールポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ScoreBoard_End(SC_BOARD_PTR ptr)
{
	int i;
	//フォントOAM解放
	for (i=0;i<BOARD_FONT_OAM_MAX;i++){
		DeleteFontOam(&ptr->Board[i].BoardAct.Name);
	}
	//セットアップデータ解放
	{
		FOAM_SETUP_DATA *data = &ptr->FntOamSetupData;
		FONTOAM_OAMDATA_Free( data->OamDataPtr );
		GF_BGL_BmpWinDel( &data->BmpWin );
	}

	//フォントOAMマネージャ破棄
	FONTOAM_SysDelete( ptr->FontOamSys );

	sys_FreeMemoryEz(ptr);
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アクターセット
 * @param	ptr					コントロールポインタ
 * @param	inBaseindex			基点となるリソースインデックス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ScoreBoard_SetAct(SC_BOARD_PTR ptr, const int inBaseIndex)
{
	int idx;
	PkthlnClAct_SetResObjCode(ptr->ActCntPtr, inBaseIndex, RES_CODE_BOARD);

	//ボード・数字
	PkthlnClAct_SetChar( ptr->ActCntPtr,
					ARC_PKTHEV_BOARD, 3,
					RES_CODE_BOARD, NNS_G2D_VRAM_TYPE_2DSUB);
	PkthlnClAct_SetPaltt( ptr->ActCntPtr,
					ARC_PKTHEV_BOARD, 0,
					RES_CODE_BOARD, NNS_G2D_VRAM_TYPE_2DSUB, BOARD_PALETTE_NUM);
	PkthlnClAct_SetCell( ptr->ActCntPtr,
					ARC_PKTHEV_BOARD, 2, RES_CODE_BOARD);
	PkthlnClAct_SetAnm(	ptr->ActCntPtr,
					ARC_PKTHEV_BOARD, 1, RES_CODE_BOARD);
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アクター使用
 * @param	ptr					コントロールポインタ
 * @param	pkthln_ptr			ポケスロンポインタ
 * @param	inBaseY				基点Y座標
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ScoreBoard_Put(SC_BOARD_PTR ptr, PKTHLN_PTR pkthln_ptr, const int inBaseY)
{
	int i,j;
	CLACT_WORK_PTR act_ptr;
	BOARD_ACT *board_act;
	VecFx32 vec;
	for(i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
		//ボード
		act_ptr = PkthlnClAct_SetActor(ptr->ActCntPtr, 0, NNS_G2D_VRAM_TYPE_2DSUB,
												RES_CODE_BOARD, ACT_CODE_BOARD );
		vec.z = 0;
		vec.x = (BOARD_W*i)*FX32_ONE;
		vec.y = (inBaseY+BOARD_Y)*FX32_ONE;
		CLACT_SetMatrix( act_ptr, &vec );
		CLACT_SetAnmFlag(act_ptr, 1);
		CLACT_AnmChg(act_ptr, 0);
		//パレット変更
		CLACT_PaletteNoChgAddTransPlttNo( act_ptr, BOARD_PLT_OFS+i );
		//プライオリティセット
		CLACT_DrawPriorityChg( act_ptr, PRI_BOARD );
		//数字
		for(j=0;j<NUMBER_NUM;j++){
			int base_x;
			act_ptr = PkthlnClAct_SetActor(ptr->ActCntPtr, 0, NNS_G2D_VRAM_TYPE_2DSUB,
														RES_CODE_BOARD, ACT_CODE_NUMBER );
			base_x = NUMBER_X+NUMBER_XOFS*i;
			vec.z = 0;
			vec.x = (base_x+j*NUMBER_W)*FX32_ONE;
			vec.y = (inBaseY+NUMBER_Y)*FX32_ONE;
			CLACT_SetMatrix( act_ptr, &vec );
			CLACT_SetAnmFlag(act_ptr, 1);
			CLACT_AnmChg(act_ptr, NUMBER_ANM_OFS);
			//プライオリティセット
			CLACT_DrawPriorityChg( act_ptr, PRI_NUMBER );
		}
	}

	//作成して表示
	for (i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
		board_act = &ptr->Board[i].BoardAct;
		//作成
		board_act->Board = PkthlnClAct_GetActPtr(ptr->ActCntPtr, RES_CODE_BOARD, ACT_CODE_BOARD);
		//表示
		PkthlnClAct_SetActive(board_act->Board, 1, 1);
		for (j=0;j<NUMBER_NUM;j++){
			//作成
			board_act->Number[j] = PkthlnClAct_GetActPtr(ptr->ActCntPtr, RES_CODE_BOARD, ACT_CODE_NUMBER );
			//表示
			PkthlnClAct_SetActive(board_act->Number[j], 1, 1);
		}
		// @@@ 作るかどうか何らかの方法で分岐させる。もしくは外に出す。
		//フォントOAM作成
		{
			CLACT_WORK_PTR act_ptr;
			STRBUF *name_buf;
			//マイステータスにアクセスして名前取得
			name_buf = MyStatus_CreateNameString(
					PTFrame_GetMyStatus(pkthln_ptr, i),
					ptr->HeapID);
			act_ptr = PkthlnClAct_GetClActWorkPtr(ptr->Board[i].BoardAct.Board);
			MakeFontOam(ptr, &ptr->FntOamSetupData,
				name_buf, NAME_OFS, 0,FOAM_Y, act_ptr, &ptr->Board[i].BoardAct.Name);
			STRBUF_Delete(name_buf);
			//表示
			FONTOAM_SetDrawFlag( ptr->Board[i].BoardAct.Name.ObjPtr, TRUE );
		}

		//初期座標セット
		ptr->Board[i].Y = inBaseY+BOARD_Y;
	}
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	得点のセット
 * @param	ptr					コントロールポインタ
 * @param	inSocre				得点
 * @param	inIndex				インデックス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ScoreBoard_SetScore(SC_BOARD_PTR ptr,  const int inScore, const u8 inIndex)
{
	GF_ASSERT(inIndex < ENTRY_MEMBER_NUM_MAX);
	ptr->Board[inIndex].Score = inScore;
	//アクターへ反映
	RefScoreAct(&ptr->Board[inIndex].BoardAct, inScore);
}

//----------------------------------------------------------------------------
/**
 *	@brief		フォントOAM作成
 *
 *	@param	ptr			コントローラポインタ
 *	@param	*inData		フォントOAMセットアップデータ
 *	@param	*str		文字列
 *	@param	inXOfs		BMPウィンドウ内Xオフセット
 *	@param	inX			表示X座標
 *	@param	inY			表示Y座標
 *	@param	parent		親
 *	@param	*outFontOam	作成したフォントOAM格納バッファ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void MakeFontOam(SC_BOARD_PTR ptr, FOAM_SETUP_DATA *inData,
		const STRBUF *str, const int inXOfs, const int inX, const int inY,
		CLACT_WORK_PTR parent, BOARD_FONT_OAM *outFontOam)
{
	FONTOAM_INIT finit;
	CHAR_MANAGER_ALLOCDATA cma;
	FONTOAM_OBJ_PTR fontoam;

	//BMPクリーン
	GF_BGL_BmpWinObjDataFill( &inData->BmpWin, 0 );
	//文字列作成
	GF_STR_PrintExpand(&inData->BmpWin, FONT_SYSTEM, str, inXOfs, 0, MSG_NO_PUT, MSGCOLOR_NAME,
			PANEL_MSG_MARGIN, 0, NULL);

	CharVramAreaAlloc(inData->Size, CHARM_CONT_AREACONT, NNS_G2D_VRAM_TYPE_2DSUB, &cma);	//オフセットモードでアロック

	finit.fontoam_sys = ptr->FontOamSys;
	finit.bmp = &inData->BmpWin;
	finit.clact_set = PkthlnClAct_GetClActSetAdr(ptr->ActCntPtr);
	finit.pltt = GetPlttIDProxy(RES_CODE_BOARD);
	finit.parent = parent;
	finit.char_ofs = cma.alloc_ofs;
	finit.x = inX;
	finit.y = inY;
	finit.bg_pri = 0;
	finit.soft_pri = BOARD_PRI_FONT;
	finit.draw_area = NNS_G2D_VRAM_TYPE_2DSUB;
	finit.heap = ptr->HeapID;

	fontoam = FONTOAM_Init(&finit);

	FONTOAM_SetPaletteNoAddTransPlttNo(fontoam, FONTOAM_PAL_NO);
	outFontOam->ObjPtr = fontoam;
	outFontOam->Data = cma;
}

//----------------------------------------------------------------------------
/**
 *	@brief	フォントOAMの破棄
 *
 *	@param	*outFontOam		フォントOAM構造体ポインタ
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void DeleteFontOam(BOARD_FONT_OAM *outFontOam)
{
	if (outFontOam->ObjPtr != NULL){
		FONTOAM_OAMDATA_Delete(outFontOam->ObjPtr);
		CharVramAreaFree(&outFontOam->Data);
		outFontOam->ObjPtr = NULL;
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	点数アクターへの反映
 *
 *	@param	*act			アクター群ポインタ
 *	@param	inScore		点数
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void RefScoreAct(BOARD_ACT *act, const int inScore)
{
	CLACT_WORK_PTR act_ptr;
	int h,t,o;

	OS_Printf("得点は%d\n",inScore);
	//点数を分解
	//百の位
	h = inScore/100;
	//十の位
	t = (inScore - (h*100)) / 10;
	//一の位
	o = inScore - (h*100) - (t*10);

	//変更
	act_ptr = PkthlnClAct_GetClActWorkPtr(act->Number[0]);
	CLACT_AnmChg(act_ptr, h+NUMBER_ANM_OFS);
	act_ptr = PkthlnClAct_GetClActWorkPtr(act->Number[1]);
	CLACT_AnmChg(act_ptr, t+NUMBER_ANM_OFS);
	act_ptr = PkthlnClAct_GetClActWorkPtr(act->Number[2]);
	CLACT_AnmChg(act_ptr, o+NUMBER_ANM_OFS);
}